#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>


union semun
{
	int inval;	
};

int sem_init(int semid,int semnum,int val)
{
	union semun mysemval;
	mysemval.inval=val;
	semctl(semid,semnum,SETVAL,mysemval);

	return 0;
}

int sem_p(int semid,int semnum)
{
	struct sembuf mybuf;
	mybuf.sem_num=semnum;
	mybuf.sem_op=-1;
	mybuf.sem_flg=0;
	semop(semid,&mybuf,1);

	return 0;
}

int sem_v(int semid,int semnum)
{
	struct sembuf mybuf;
	mybuf.sem_num=semnum;
	mybuf.sem_op=1;
	mybuf.sem_flg=0;
	semop(semid,&mybuf,1);

	return 0;
}



int main(int argc, const char *argv[])
{
	key_t key1=ftok("./1.txt",'a');
	int semid=semget(key1,2,IPC_CREAT|0664);
	sem_init(semid,0,1);
	sem_init(semid,1,0);


	pid_t pid=fork();
	if(pid==0)
	{
		while(1)
		{
			sem_p(semid,0);
			printf("1\n");
			sleep(1);
			sem_v(semid,1);

		}
	}
	if(pid>0)
	{
		while(1)
		{
			sem_p(semid,1);
			printf("2\n");
			sleep(1);
			sem_v(semid,0);
		}
	}
	return 0;
}
